﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;

namespace Gerencial_Fisio_Nutry.Tela
{
    public partial class EntradaNota : Form
    {
        public EntradaNota()
        {
            InitializeComponent();
        }
        Nota.NotaFiscal nota;
        private void btCarregar_Click(object sender, EventArgs e)
        {

            OpenFileDialog fdlg = new OpenFileDialog();
            fdlg.Title = "Selecione o arquivo";
            fdlg.InitialDirectory = @"D:/";
            //fdlg.FileName = txtNomeArquivo.Text;
            fdlg.Filter = "XML Files(*.xml)|*.xml|All Files(*.*)|*.*";
            fdlg.FilterIndex = 1;
            fdlg.RestoreDirectory = true;
            if (fdlg.ShowDialog() == DialogResult.OK)
            {
                nota = new Nota.NotaFiscal();
                XmlDocument xmlNota = new XmlDocument();
                xmlNota.Load(fdlg.FileName);
                nota = trabalharXML(xmlNota);
              nota =  trabalhaNota(nota);
                carregarTela(nota);
                Application.DoEvents();
            }
     
        }

        public Nota.NotaFiscal trabalhaNota(Nota.NotaFiscal nota)
        {
            Banco.MetodoBanco metodo = new Banco.MetodoBanco();
            if (metodo.temNota(nota.nnf))
            {
                MessageBox.Show("Essa nota já consta no sistema", "Informação");
                this.Close();
                return nota;
            }
            if (!metodo.temFornecedor(nota.emit.CNPJ))
            {
                metodo.cadastrarFornecedor(nota.emit.CNPJ, nota.emit.xNome, "", nota.emit.enderEmit1.xLgr, nota.emit.enderEmit1.xBairro,
                    nota.emit.enderEmit1.xMun, nota.emit.enderEmit1.UF, nota.emit.enderEmit1.CEP
                    , nota.emit.enderEmit1.nro, nota.emit.enderEmit1.fone,  DateTime.Now, nota.emit.xFant,nota.emit.IE,nota.emit.CRT
                    ,nota.emit.enderEmit1.cMun,nota.emit.enderEmit1.cPais, nota.emit.enderEmit1.xPais);
                
                //cadastrar este fornecedor
                
            }

            nota.emit.cod_fornecedor = metodo.cod_fornecedorByCNPJ(nota.emit.CNPJ);
            //nesse momento o fornecedor inedito foi cadastrado

            metodo.inserirNotaFiscal(nota, double.Parse(tbLucro.Text.ToString().Replace('.', ',')), double.Parse(tbDesconto.Text.ToString().Replace('.', ',')));
            return nota;
        }
        public Gerencial_Fisio_Nutry.NotaInterna.Conjunto trabalhaNotaInterna(Gerencial_Fisio_Nutry.NotaInterna.Conjunto conjunto)
        {
            Gerencial_Fisio_Nutry.NotaInterna.MetodoInterno metodo = new Gerencial_Fisio_Nutry.NotaInterna.MetodoInterno();
            Banco.MetodoBanco metodo2 = new Banco.MetodoBanco();

          
            foreach (Gerencial_Fisio_Nutry.NotaInterna.Conjunto.itemInterno item in conjunto.itensInterno)

                foreach (Gerencial_Fisio_Nutry.NotaInterna.Conjunto.itemInterno.NotaInterna not in item.notas)
                    if (!metodo2.temFornecedor(not.fornec.CNPJ))
                    {
                            metodo2.cadastrarFornecedor(not.fornec.CNPJ, not.fornec.xNome, "", not.fornec.enderEmit1.xLgr
                                , not.fornec.enderEmit1.xBairro,
                                not.fornec.enderEmit1.xMun, not.fornec.enderEmit1.UF, not.fornec.enderEmit1.CEP
                                , not.fornec.enderEmit1.nro, not.fornec.enderEmit1.fone, DateTime.Now
                                , not.fornec.xFant, not.fornec.IE, not.fornec.CRT
                                , not.fornec.enderEmit1.cMun, not.fornec.enderEmit1.cPais, not.fornec.enderEmit1.xPais);
                            not.fornec.cod_fornecedor = metodo2.cod_fornecedorByCNPJ(not.fornec.CNPJ);

                    }
                        else
                            not.fornec.cod_fornecedor = metodo2.cod_fornecedorByCNPJ(not.fornec.CNPJ);
                    

            foreach (Gerencial_Fisio_Nutry.NotaInterna.Conjunto.itemInterno item in conjunto.itensInterno)
            {
                if (!metodo2.existeProduto(item.cod_produto))
                    metodo2.cadastrarProduto(item.cod_produto, item.referencia, item.descricao, item.precoSaida, item.unidade, 1, item.descontoLimite, item.CFOP, item.NCM, item.cod_produto);
                foreach (Gerencial_Fisio_Nutry.NotaInterna.Conjunto.itemInterno.NotaInterna not in item.notas)
                {
                    if (metodo2.temNota(not.nnf))
                    {
                        //cadastra estoque atravez de update
                     //   metodo2.insereEstoqueItemExistente(not.nnf, item.cod_produto, not.quantidadeNota);
                        metodo2.insereEstoqueItem(not.nnf, item.cod_produto, not.quantidadeNota, not.valorCompra, DateTime.Now.AddDays(90).ToShortDateString());
                    }
                    else 
                    {
                        metodo2.inserirNotaFiscalInterna(not);
                        metodo2.insereEstoqueItem(not.nnf, item.cod_produto, not.quantidadeNota, not.valorCompra,DateTime.Now.AddDays(90).ToShortDateString());
                    }
                }
                

            }
          //fornecedor ajustado, notas ajustadas, resta somente dar entrada no estoque de cada Item

           
            return conjunto;
        }

        public Nota.NotaFiscal trabalharXML(XmlDocument xml)
        {
            Nota.NotaFiscal nota = new Nota.NotaFiscal();
           
            XmlNodeList xnList66 = xml.GetElementsByTagName("infNFe");
            foreach (XmlNode node in xnList66)
            {
                nota.id =(node.Attributes.GetNamedItem("Id").Value);
                nota.versao = (node.Attributes.GetNamedItem("versao").Value);
            }
            XmlNodeList xnList = xml.GetElementsByTagName("ide");
            foreach (XmlNode node in xnList)
            {
                #region ide
                nota.cuf = int.Parse(node["cUF"].InnerText);
                nota.cnf = (node["cNF"].InnerText);
                nota.natop = (node["natOp"].InnerText);
                nota.indpag = int.Parse(node["indPag"].InnerText);
                nota.mod = int.Parse(node["mod"].InnerText);
                nota.serie = int.Parse(node["serie"].InnerText);
                nota.nnf = int.Parse(node["nNF"].InnerText);
                nota.demi = Convert.ToDateTime(node["dEmi"].InnerText);
                nota.dsaient = Convert.ToDateTime(node["dSaiEnt"].InnerText);
                nota.tpnf = int.Parse(node["tpNF"].InnerText);
                nota.cmunfg = (node["cMunFG"].InnerText);
                nota.tpimp = int.Parse(node["tpImp"].InnerText);
                nota.tpemis = int.Parse(node["tpEmis"].InnerText);
                nota.cdv = int.Parse(node["cDV"].InnerText);
                nota.tpamb = int.Parse(node["tpAmb"].InnerText);
                nota.finnfe = int.Parse(node["finNFe"].InnerText);
                nota.procemi = int.Parse(node["procEmi"].InnerText);
                nota.verproc = (node["verProc"].InnerText);
                #endregion
            }
            XmlNodeList xnList2 = xml.GetElementsByTagName("total");
            foreach (XmlNode node in xnList2)
            {
                foreach (XmlNode no in node)
                {
                    #region total
                    nota.vBC = double.Parse(no["vBC"].InnerText.Replace('.',','));
                    nota.vICMS = double.Parse(no["vICMS"].InnerText.Replace('.', ','));
                    nota.vBCST = double.Parse(no["vBCST"].InnerText.Replace('.', ','));
                    nota.vST = double.Parse(no["vST"].InnerText.Replace('.', ','));
                    nota.vProd = double.Parse(no["vProd"].InnerText.Replace('.', ','));
                    nota.vFrete = double.Parse(no["vFrete"].InnerText.Replace('.', ','));
                    nota.vSeg = double.Parse(no["vSeg"].InnerText.Replace('.', ','));
                    nota.vDesc = double.Parse(no["vDesc"].InnerText.Replace('.', ','));
                    nota.vII = double.Parse(no["vII"].InnerText.Replace('.', ','));
                    nota.vIPI = double.Parse(no["vIPI"].InnerText.Replace('.', ','));
                    nota.vPIS = double.Parse(no["vPIS"].InnerText.Replace('.', ','));
                    nota.vCOFINS = double.Parse(no["vCOFINS"].InnerText.Replace('.', ','));
                    nota.vOutro = double.Parse(no["vOutro"].InnerText.Replace('.', ','));
                    nota.vNF = double.Parse(no["vNF"].InnerText.Replace('.', ','));
                    #endregion
                }
            }
            XmlNodeList xnList9 = xml.GetElementsByTagName("cobr");
            foreach (XmlNode node in xnList9)
            {
                #region cobr
                foreach (XmlNode no in node)
                {
                    int cont = 0;
                    try
                    {//fat
                        nota.cobr.fat1.nFat = int.Parse(no["nFat"].InnerText);
                        nota.cobr.fat1.vOrig = double.Parse(no["vOrig"].InnerText.Replace('.', ','));
                        nota.cobr.fat1.vLiq = double.Parse(no["vLiq"].InnerText.Replace('.', ','));
                        nota.nfat = nota.cobr.fat1.nFat;
                        nota.vorig = nota.cobr.fat1.vOrig;
                        nota.vliq = nota.cobr.fat1.vLiq;
                    }
                    catch { }
                    try
                    {//dup
                        Nota.Cobranca.dup du = new Nota.Cobranca.dup();
                        du.cod_fatura = ++cont;
                        du.dVenc =Convert.ToDateTime(no["dVenc"].InnerText);
                            du.nDup =int.Parse(no["nDup"].InnerText);
                            du.vDup = double.Parse(no["vDup"].InnerText.Replace('.', ','));
                            nota.cobr.dup1.Add(du);
                    }
                    catch { }
                }
                #endregion
            }
            XmlNodeList xnList3 = xml.GetElementsByTagName("emit");
            foreach (XmlNode node in xnList3)
            {
                #region total
                  nota.emit.CNPJ = node["CNPJ"].InnerText;
                  nota.emit.xNome = node["xNome"].InnerText;
                  nota.emit.IE = node["IE"].InnerText;
                  nota.emit.CRT = int.Parse(node["CRT"].InnerText);
                  nota.emit.xFant = node["xFant"].InnerText;

                  foreach (XmlNode no in node)
                  {
                      
                      try
                      {
                          nota.emit.enderEmit1.xLgr = no["xLgr"].InnerText;
                          nota.emit.enderEmit1.nro = no["nro"].InnerText;
                          nota.emit.enderEmit1.xBairro = no["xBairro"].InnerText;
                          nota.emit.enderEmit1.cMun = no["cMun"].InnerText;
                          nota.emit.enderEmit1.xMun = no["xMun"].InnerText;
                          nota.emit.enderEmit1.UF = no["UF"].InnerText;
                          nota.emit.enderEmit1.CEP = no["CEP"].InnerText;
                          nota.emit.enderEmit1.xPais = no["xPais"].InnerText;
                          nota.emit.enderEmit1.fone = no["fone"].InnerText;
                          nota.emit.enderEmit1.cPais = int.Parse(no["cPais"].InnerText);
                       

                      }
                      catch { }
                  }
                #endregion
            }
            XmlNodeList xnList4 = xml.GetElementsByTagName("dest");
            foreach (XmlNode node in xnList4)
            {

                string item = node["CNPJ"].InnerText;

            }
            XmlNodeList xnList7 = xml.GetElementsByTagName("det");
            foreach (XmlNode no in xnList7)
            {
                Nota.ItemNota  its = new Nota.ItemNota();
               
                its.nItem = int.Parse( no.Attributes.GetNamedItem("nItem").Value);
                #region prod
                    foreach (XmlNode node in no)
                    {//prod
                        try
                        {
                            its.prod1.cProd = int.Parse(node["cProd"].InnerText.Split('.')[2]);
                            its.prod1.cEAN = node["cEAN"].InnerText;
                            its.prod1.xPROD = node["xProd"].InnerText;
                            its.prod1.NCM = node["NCM"].InnerText;
                            its.prod1.CFOP = int.Parse(node["CFOP"].InnerText);
                            its.prod1.uCom = node["uCom"].InnerText;
                            its.prod1.qCom = double.Parse(node["qCom"].InnerText.Replace('.', ','));
                            its.prod1.vUnCom = double.Parse(node["vUnCom"].InnerText.Replace('.', ','));
                            its.prod1.vProd = double.Parse(node["vProd"].InnerText.Replace('.', ','));
                            its.prod1.cEANTrib = node["cEANTrib"].InnerText;
                            its.prod1.uTrib = node["uTrib"].InnerText;
                            its.prod1.qTrib = double.Parse(node["qTrib"].InnerText.Replace('.', ','));
                            its.prod1.vUnTrib = double.Parse(node["vUnTrib"].InnerText.Replace('.', ','));
                            its.prod1.vDesc = double.Parse(node["vDesc"].InnerText.Replace('.', ','));
                            its.prod1.indTot = int.Parse(node["indTot"].InnerText);
                        }
                        catch { }
                    }
                    #endregion
                nota.det.Add(its);
            }
            XmlNodeList xnList5 = xml.GetElementsByTagName("transp");
            foreach (XmlNode node in xnList5)
            {
                #region transp
                nota.transp.modFrete = int.Parse(node["modFrete"].InnerText);
                foreach (XmlNode no in node)
                {
                    try   {
                        nota.transp.transporta1.CNPJ = no["CNPJ"].InnerText;
                        nota.transp.transporta1.xNome = no["xNome"].InnerText;
                        nota.transp.transporta1.IE = no["IE"].InnerText;
                        nota.transp.transporta1.xEnder = no["xEnder"].InnerText;
                        nota.transp.transporta1.xMun = no["xMun"].InnerText;
                        nota.transp.transporta1.UF = no["UF"].InnerText;
                    }      catch { }
                    try   {
                        nota.transp.vol1.qVol = int.Parse(no["qVol"].InnerText);
                        nota.transp.vol1.esp = no["esp"].InnerText;
                        nota.transp.vol1.nVol = int.Parse(no["nVol"].InnerText);
                        nota.transp.vol1.pesoL = double.Parse(no["pesoL"].InnerText.Replace('.', ','));
                    }      catch { }
                }
                #endregion
            }

            return nota;
   //         XmlNodeList xnList = xml.GetElementsByTagName("contato");

        }
      

        public void preencherItens(Nota.ItemNota[] itens)
        {
            for (int i = 0; i < itens.Length; i++)
            {
                //e.nnf,p.cod_produto, p.referencia, p.descricao, p.descontoLimite,e.valorCompra, e.quantidadeNota, e.dataValidade

                string[] linha = {nota.nnf.ToString("000") 
                                     , itens[i].prod1.cProd.ToString()
                                     , (  new Banco.MetodoBanco().referenciaByProduto(itens[i].prod1.cProd)  ) 
                                 ,itens[i].prod1.xPROD
                                 ,(new Banco.MetodoBanco().descontoByProduto(itens[i].prod1.cProd) * 100)+" %"    
                                 ,itens[i].prod1.vUnCom.ToString("0.00"),itens[i].prod1.qCom.ToString("0.00"),
                                 ( new Banco.MetodoBanco().dataValidadeByProdutoEntrada (itens[i].prod1.cProd, nota.nnf   )  )  };
               
                dgvItens.Rows.Add(linha);
            }
        }
        public void preencherFatura(Nota.Cobranca  faturas)
        {
                foreach (Nota.Cobranca.dup dupli in faturas.dup1)
                {  
                    string[] linha = {dupli.cod_fatura.ToString("00000"),dupli.nDup.ToString("00000"),
                                     dupli.vDup.ToString("0.00"),dupli.dVenc.ToShortDateString()};

                    dgvFatura.Rows.Add(linha);
                }
            
        }
        public void carregarTela(Nota.NotaFiscal nota){
            tbCodFornec.Text = nota.emit.cod_fornecedor.ToString("00000");
            tbCAcesso.Text = nota.id;
            tbNatureza.Text = nota.natop;
            tbTotalItens.Text = nota.det.Count.ToString();
            tbTotalNota.Text = nota.vNF.ToString("0.00");
            tbNumeroNota.Text = nota.nnf.ToString("00000");
            tbSerie.Text = nota.serie.ToString();
            tbRazaoFornec.Text = nota.emit.xNome;
            tbDataEmissao.Text = nota.demi.ToShortDateString();
            tbDataEntrada.Text = nota.dsaient.ToShortDateString();

            
            preencherItens(nota.det.ToArray());
            preencherFatura(nota.cobr);
        }

        private void cMenuReferencia_Click(object sender, EventArgs e)
        {
            if (codproduto == 0)
                return;
            new MicroTela.AtualizaReferencia(descricao, referencia, codproduto).ShowDialog();
        }

        private void cMenuDesconto_Click(object sender, EventArgs e)
        {
            if (codproduto == 0)
                return;
            new MicroTela.AlteraDesconto(descricao, codproduto, desconto).ShowDialog();
        }

        private void cMenuValor_Click(object sender, EventArgs e)
        {
            if (codproduto == 0)
                return;
            new MicroTela.AlterarValorEntrada(codproduto,nnf,valor,descricao).ShowDialog();

           
        }

        private void cMenuValidade_Click(object sender, EventArgs e)
        {
            if (codproduto == 0)
                return;
          //  new MicroTela.MovimentaCaixa(codproduto, nnf, data, descricao).ShowDialog();
        }

        private void cMenuDesconpactar_Click(object sender, EventArgs e)
        {

        }
        string data;
        int nnf;
        int codproduto;
        string descricao;
        double valor;
        string referencia;
        double desconto;
        private void dgvItens_RowEnter(object sender, DataGridViewCellEventArgs e)
        {

            try
            {
                nnf = int.Parse(dgvItens.Rows[e.RowIndex].Cells[0].Value.ToString());
                codproduto = int.Parse(dgvItens.Rows[e.RowIndex].Cells[1].Value.ToString());
                descricao = dgvItens.Rows[e.RowIndex].Cells[3].Value.ToString();
                valor = double.Parse(dgvItens.Rows[e.RowIndex].Cells[5].Value.ToString());
                data = dgvItens.Rows[e.RowIndex].Cells[7].Value.ToString();
                referencia = dgvItens.Rows[e.RowIndex].Cells[2].Value.ToString();
                desconto = double.Parse(dgvItens.Rows[e.RowIndex].Cells[4].Value.ToString().Replace('%',' '));
            }
            catch
            {
                nnf = 0;
                codproduto = 0;
            }

        }


        private void button1_Click_1(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btInterno_Click(object sender, EventArgs e)
        {
            //e necessario verificar as condicoes de aceitacao dessa nota.
            //talvez seja possivel admitir nota como esta atualmente, negando.
            //ultimo passo para realizar essa proeza.

            OpenFileDialog fdlg = new OpenFileDialog();
            fdlg.Title = "Selecione o arquivo";
            fdlg.InitialDirectory = @"D:/";
            //fdlg.FileName = txtNomeArquivo.Text;
            fdlg.Filter = "XML Files(*.xml)|*.xml|All Files(*.*)|*.*";
            fdlg.FilterIndex = 1;
            fdlg.RestoreDirectory = true;
            if (fdlg.ShowDialog() == DialogResult.OK)
            {
                Gerencial_Fisio_Nutry.NotaInterna.Conjunto conjunto = new Gerencial_Fisio_Nutry.NotaInterna.Conjunto();

                XmlDocument xmlNotaInterna = new XmlDocument();
                xmlNotaInterna.Load(fdlg.FileName);

                if (verificaValidadeNota(xmlNotaInterna))
                {
                   
                    conjunto =new Gerencial_Fisio_Nutry.NotaInterna.MetodoInterno().entradaInterna (xmlNotaInterna);
                    modificaXML(xmlNotaInterna);
                   conjunto = trabalhaNotaInterna(conjunto);
                   Application.DoEvents();
                 
                   MessageBox.Show("NOTA INTERNA CARREGADA COM SUCESSO", "TITAN");
                   this.Close();
                }               
            }     
        }
        public void modificaXML(XmlDocument xml)
        {   
            // pega o AppSettings...
            System.Xml.XmlNode node = xml.DocumentElement.SelectSingleNode("notaLida");
            
            // varre os items Add...
            
                if (string.Compare(node.InnerText, "false") == 0)
                    node.InnerText = "true";
           
            xml.Save(@xml.LocalName);
        }
        public bool verificaValidadeNota(XmlDocument xml)
        {
            System.Xml.XmlNode node = xml.DocumentElement.SelectSingleNode("notaLida");

            // varre os items Add...

            if (string.Compare(node.InnerText, "false") == 0)
                return true;
            else return false;
        }
      
    }
}
